package reflection.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * JDK动态代理
 * JDK的动态代理机制只能代理实现了接口的类，否则不能实现JDK的动态代理
 * @author 12609
 *
 */
public class DynamicProxyTicketManager implements InvocationHandler{
	
	private Object targetObject;
	
	/**
	 * 根据目标生成代理类
	 * @param targetObject
	 * @return
	 */
	public Object newProxyInstance(Object targetObject) {
		this.targetObject = targetObject;
		// 第一个参数，目标对象 的装载器
        // 第二个参数，目标接口已实现的所有接口，而这些是动态代理类要实现的接口列表
        // 第三个参数， 调用实现了InvocationHandler的对象生成动态代理实例，当你一调用代理，代理就会调用InvocationHandler的invoke方法
		// 这里就是会  执行this.invoke(Object proxy,Method method,Object[] args);
		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), 
				targetObject.getClass().getInterfaces(), this);
	}
	

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		checkIdentity();
		Object result = null;
		try {
			result = method.invoke(targetObject, args);
			log();
		} catch (Exception e) {
			e.printStackTrace();
            // 失败时，打印失败信息
            System.out.println("error-->>" + method.getName());
            throw e;
		}
		return result;
	}
	
	/**
     * 身份验证
     */
    private void checkIdentity(){
        System.out.println("身份验证--------------");
    }
    /**
     * 打印日志
     */
    private void log(){
        System.out.println("日志..." );
    }


}
